package com.itheima.quickstart;

/**
 * 按照我们之前讲的数组的执行原理，数组变量记录的其实数数组在堆内存中的地址。
 * 其实面向对象的代码执行原理和数组的执行原理是非常类似的。test类先加载到方法区，然后执行test类里的main方法，然后到创建学生对象之前先把学生类加载到方法区
 * 其实`Student s1 = new Student();`这句话中的原理如下
 * 1. `Student s1`表示的是在栈内存中，创建了一个Student类型的变量，变量名为s1
 * 2. 而`new Student()`会在堆内存中创建一个对象，在堆内存开辟一个变量空间，包含学生的属性名和属性值。
 *    并且这个对象里面还有一个类的地址信息，这个地址是指向当前当前这个对象是由哪一个类创建的
 * 3.同时系统会为这个Student对象分配一个十六进制形式的地址值0x4f3f5b24
 * - 接着把这个对象的地址值赋值给栈内存中的变量s1，通过s1记录的地址就可以找到这个对象
 * - 当执行`s1.name=“播妞”`时，其实就是通过变量s1里面的地址找到堆内存的对象，再找到对象的name属性，再给对象的name属性赋值为`播妞`;
 * 4.然后通过s1变量里面的地址找到学生对象，在通过对象里面存放的类地址信息，再找到方法区中的成员方法
 */
public class Test {
    public static void main(String[] args) {
        // 目标：面向对象编程快速入门。
        // 1、创建一个学生对象:new Student(); 封装播妞的数据
        //把new的学生对象交给一个学生变量
        Student s1 = new Student();
        s1.name = "播妞";
        s1.chinese = 100;
        s1.math = 100;
        s1.printTotalScore();
        s1.printAverageScore();


        // 2、再创建一个学生对象，封装播仔的数据
        Student s2 = new Student();
        s2.name = "播仔";
        s2.chinese = 59;
        s2.math = 100;
        s2.printTotalScore();
        s2.printAverageScore();

        System.out.println("============");

        System.out.println(s1);
        System.out.println(s2);
    }
}
